<?php
namespace Admin\Controller;

use Think\Controller;

/**-- object $model 模型，由调用方法传入，必填 --**/
/**-- string $method 操作方法(select,add,save,delete)，由调用方法传入，必填 --**/
/**-- array $param 参数(表单提交上来并做过处理的数据)，由调用方法传入，必填 --**/
/**-- array $rule 搜索项规则，由调用方法传入，默认值 null --**/
/**-- array $field 过滤字段，由调用方法传入，默认值 null --**/
/**-- array $filter 过滤方法，由调用方法传入，默认值 null --**/
/**-- array $page 查询页码，从$param中获取，默认值 1 --**/
/**-- array $limit 查询单页显示数量，从$param中获取，默认值 20 --**/
/**-- array $where 查询条件，通过($param,$rule)中获取，默认值 20 --**/
/**-- string|bool $stat 数据操作(add,save,delete)的返回值 --**/
/**-- array|bool $data 数据查询(select)的返回值 --**/
/**-- array $receive 接收其他方法返回值 --**/
/**-- array $result 封装数据返回给调用者 --**/

class DataController extends Controller
{
    private $key = array(
        'page' => 'pageIndex',
        'limit' => 'pageSize',
        'keyword' => 'select',
    );

    /**-- 通过$param，$rule生成$where条件 --**/
    public function where($param='',$rule=''){
        $key = $this->key;
        if($param != ''){
            foreach($param as $k1=>$v1){
                if(array_search($k1,$key) == null){
                    $where[$k1] = $v1;
                }elseif($k1 == $key['keyword']){
                    if($k1 != ''){
                        if($rule != ''){
                            foreach($rule as $k2=>$v2){
                                preg_match($v2['regex'],$v1,$match);
                                if($match){
                                    if($v2['exp'] == 'like'){
                                        $where[$k2] = array($v2['exp'],'%'.$v1.'%');
                                    }else{
                                        $where[$k2] = array($v2['exp'],$v1);
                                    }
                                }
                            }
                        }else{
                            echo '$rule缺失！';
                        }
                    }
                }
            }
        }
//        $this->ajaxReturn($where);
        $where = isset($where) ? $where : '';
        return $where;
    }

    /**-- 创建数据 创建成功返回数据，否则返回false --**/
    public function create($model,$where,$field=''){
        //通过$param,$field创建数据对象
        if($field == ''){ //$field为空，不进行字段过滤
            $create = $model->create($where);
        }else{ //$field不为空，则进行字段过滤
            $create = $model->field($field)->create($where);
        }
        if(!$create){ //$create创建不成功，封装数据$result
            $result['stat'] = 0;
            $result['msg'] = $model->getError();
        }else{ //$create创建成功，封装数据$result
            $result['stat'] = 1;
            $result['create'] = $create;
        }
        //返回$result
        return $result;
    }

    /**-- 通过$method确认方法，查询/更新数据 --**/
    public function handle($model,$method,$param='',$rule='',$field='',$filter=''){
        if($method == 'select'){
            $key = $this->key;
            foreach($key as $k=>$v){
                if(isset($param[$v])){
                    $$k = $param[$v];
                }
            }
            $page = isset($page) ? $page : 1;
            $limit = isset($limit) ? $limit : 20;
            $where = R('Data/where',array($param,$rule));
            $data = $model->where($where)->field($field)->page($page, $limit)->select(); //返回（array/null/false）
            $result['data'] = $data;
            if($data){
                $result['stat'] = 1;
                $result['count'] = $model->where($where)->count();
            }elseif($data == null){
                $result['stat'] = 1;
                $result['count'] = 0;
            }else{
                $result['stat'] = 0;
                $result['count'] = null;
            }
        }elseif($method == 'add' || $method == 'save'){
            $where = R('Data/where',array($param));
            $create = R('Data/create',array($model,$where,$field));
            if($create['stat']){
                $stat = $model->$method();
                if($stat){
                    $result['stat'] = 1;
                    $result['msg'] = $stat;
                }else{
                    $result['stat'] = 0;
                    $result['msg'] = $model->getDbError();
                }
            }else{
                $result = $create;
            }
        }elseif($method == 'delete'){
            $where = R('Data/where',array($param,$rule));
            $stat = $model->where($where)->delete();
            if($stat){
                $result['stat'] = 1;
                $result['msg'] = $stat;
            }else{
                $result['stat'] = 0;
                $result['msg'] = $model->getDbError();
            }
        }
        return $result;
//        $this->ajaxReturn($result);
    }

    /**-- 查询数据 --**/
    public function read($model,$param='',$rule='',$field='')
    {
        $key = $this->key;
        foreach($key as $k=>$v){
            if(isset($param[$v])){
                $$k = $param[$v];
            }
        }
        $page = isset($page) ? $page : 1;
        $limit = isset($limit) ? $limit : 20;
        $where = R('Data/where',array($param,$rule));
        $data = $model->where($where)->field($field)->page($page, $limit)->select(); //返回（array/null/false）
        $result['data'] = $data;
        if($data){
            $result['stat'] = 1;
            $result['count'] = $model->where($where)->count();
        }elseif($data == null){
            $result['stat'] = 1;
            $result['count'] = 0;
        }else{
            $result['stat'] = 0;
            $result['count'] = null;
        }
        return $result;
    }

    /**-- 根据项目实际情况搜索数据 --**/
    public function search($model,$param,$rule='',$field=''){
        //设置前端上传的($page,$limit,$keyword)的键名
        $key_page = 'pageIndex';
        $key_limit = 'pageSize';
        $key_keyword = 'keyword';
        //释放$param中($page,$limit)的对应的键值
        unset($param[$key_page]);
        unset($param[$key_limit]);
        //通过$param,$rule生成$where
        foreach($param as $k=>$v){
            if($k != 'keyword'){ //$param中选择项，添加到$where中
                if($v != ''){
                    $where[$k] = $v;
                };
            }else{ //$param中非选择项，添加到$where中
                if($param[$key_keyword] == ''){ //$keyword为空则直接到下一个循环
                    continue;
                }elseif($rule != ''){ //$rule不为空，则通过将$keyword键值添加到$where中
                    foreach($rule as $k1=>$v1){
                        preg_match($v1['regex'],$param[$key_keyword],$match);
                        if($match){
                            if($v1['exp'] == 'like'){
                                $where[$k1] = array($v1['exp'],'%'.$param[$key_keyword].'%');
                            }else{
                                $where[$k1] = array($v1['exp'],$param[$key_keyword]);
                            }
                            break;
                        }
                    }
                }else{ //$rule为空，则提示缺失$rule，并退出脚本
                    echo '请添加搜索规则';
                    exit;
                }
            }
        }
        //获取($page,$limit)的值
        $page = (I('param'.$key_page,'','intval') == '') ? '' : I('param'.$key_page,'','intval') + 1;
        $limit = I('param'.$key_limit,'','intval');
        //通过($model,$where)查询记录数
        $count = $model->where($where)->count();
        //调用read方法，通过($model,$where,$field,$page,$limit)查询数据
        $data = R('Data/read',array($model,$where,$field,$page,$limit));
        //封装数据$res
        $res['data'] = $data;
        $res['count'] = $count;
        //返回$res
        return $res;
    }

//    /**-- 生成数据 --**/
//    public function data($model,$param){
//        return $model->data($param);
//    }

    /**-- 通过data()添加/更新数据 --**/
    public function data_save($model,$param,$method,$where,$field='',$filter=''){
        $pk = $model->getPk();
        if(isset($pk)){
            $stat = $model->data($param)->$method();
        }else{
            $stat = $model->where($where)->data($param)->$method();
        }
        if($stat){
            $res['sata'] = true;
        }else{
            $res['sata'] = false;
            $res['msg'] = $model->getDbError();
        }
        return $res;
    }

    /**-- 删除数据 --**/
    public function delete($model,$where){
        $stat = $model->where($where)->delete();
        if($stat){
            $res['sata'] = true;
        }else{
            $res['sata'] = false;
            $res['msg'] = $model->getDbError();
        }
        return $res;
    }
}